home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / mus / misc / MpegAnalys-r.lha / MpegAnalys-r / MpegAnalys-r0.2.cpp < prev    next >
C/C++ Source or Header  |  1980-01-01  |  25KB  |  457 lines

  1. #include <fstream.h>
  2. #include <iomanip.h>
  3. #include <stdlib.h>
  4.  
  5. #define DEBUG 1
  6.  
  7. char *vers = "$VER: MpegAnalys-r 0.2 [16. August 2000]";
  8.  
  9. int errors=0;
  10. long firstvalidframe=-1;
  11.  
  12. class frame
  13. {
  14.   public:
  15.      long position;      // the absolute position of the first headerbyte in file
  16.     short invalidheader; // BOOL, indicates whether this frame is ok
  17.     short framelength;   // contains expected length of frame in bytes, calculated from header
  18.     short headercounter;
  19.     // Mpeg Information
  20.     short id;
  21.     short layer;
  22.     short bitrate;
  23.      long frequency;
  24.     short protection;    // BOOL
  25.     short priv;          // BOOL
  26.     short padding;       // BOOL, indicates whether an additional bit is present
  27.     frame()
  28.     {
  29.         invalidheader=0;
  30.         framelength=0;
  31.         id=0;
  32.         layer=0;
  33.         bitrate=0;
  34.         frequency=0;
  35.         protection=0;
  36.         priv=0;
  37.         padding=0;
  38.         // cout <<this<<" created"<<endl;
  39.     }
  40.     ~frame()
  41.     {
  42.         // cout <<this<<" removed"<<endl;
  43.     }
  44. };
  45.  
  46. int main(int argc, char **argv)
  47. {
  48.     fstream ein;
  49.     class frame *thisframeptr=0, *lastframeptr=0, *errorframeptr=0, *lastvalidframeptr=0, *nextvalidframeptr=0;
  50.     short infolevel=0, headercounter=0;
  51.     long filesize=0, header[3]={0,0,0}, checkbits=0, actualposition=0, framingerrors=0, invalidtagcounter=0;
  52.     cout <<"|      MpegAnalys-r  0.2      |"<<endl;
  53.     cout <<"| by radiat-r@Sascha-Ploss.de |"<<endl;
  54.     if (argc > 3) cout <<"Wrong parameters\nUsage: "<<argv[0]<<" filename [infolevel]"<<endl;
  55.     if (argc > 2) infolevel=atoi(argv[2]);
  56.     ein.open(argv[1],ios::in);
  57.     if (ein.is_open())
  58.     {
  59.         ein.seekg(0, ios::end); /* move to last byte */
  60.         filesize=ein.tellg();   /* get size of file */
  61.         ein.seekg(0, ios::beg); /* move back to start */
  62.         if (filesize > 1)
  63.         {
  64.             header[0]=ein.get(); /* get first header */
  65.             header[1]=ein.get(); /* get first header */
  66.             header[2]=ein.get(); /* get first header */
  67. //            while ((header[0] != EOF) && (firstvalidframe == -1))   /* loop till eof or first valid header is known */
  68.             while (header[2] != EOF)   /* loop till eof */
  69.             {
  70. /* -------------------- Main Program Loop ------------------------------- */
  71.                 checkbits=header[1]/32; /* remove the last 5 bits from char */
  72.                 if ((checkbits == 7) && (header[0] == 0xFF)) /* sync found (11 set bits) */
  73.                 {
  74.                     thisframeptr=new frame;
  75.                     if (thisframeptr)
  76.                     {
  77.                         thisframeptr->position=actualposition;
  78.                         thisframeptr->headercounter=headercounter;
  79. // ------------------ checking frame information ------------------
  80.                         checkbits=(header[1]/8)-28;   /* get the id bytes */
  81.                         thisframeptr->id=4-checkbits;   // id == 4 is Mpeg 2.5
  82.                         if (thisframeptr->id == 3)
  83.                         {
  84.                             thisframeptr->invalidheader=1;
  85.                         }
  86.                         checkbits=(header[1]-((header[1]/8)*8))/2; /* get the layer bytes */
  87.                         thisframeptr->layer=4-checkbits;
  88.                         if (thisframeptr->layer == 4)
  89.                         {
  90.                             thisframeptr->invalidheader=1;
  91.                         }
  92.                         checkbits=header[1]-((header[1]/2)*2); /* get protection bit */
  93.                         if (!checkbits)
  94.                         {
  95.                             thisframeptr->protection=1;
  96.                         }
  97.                         checkbits=header[2]/16;
  98.                         if ((checkbits < 1) || (checkbits > 14))
  99.                         {
  100.                             thisframeptr->invalidheader=1;
  101.                         }
  102.                         else
  103.                         {
  104.                             if (thisframeptr->id == 1)
  105.                             {
  106.                                 if (thisframeptr->layer == 1)
  107.                                 {
  108.                                     if (checkbits == 1) thisframeptr->bitrate=32;
  109.                                     else if (checkbits == 2) thisframeptr->bitrate=64;
  110.                                     else if (checkbits == 3) thisframeptr->bitrate=96;
  111.                                     else if (checkbits == 4) thisframeptr->bitrate=128;
  112.                                     else if (checkbits == 5) thisframeptr->bitrate=160;
  113.                                     else if (checkbits == 6) thisframeptr->bitrate=192;
  114.                                     else if (checkbits == 7) thisframeptr->bitrate=224;
  115.                                     else if (checkbits == 8) thisframeptr->bitrate=256;
  116.                                     else if (checkbits == 9) thisframeptr->bitrate=288;
  117.                                     else if (checkbits == 10) thisframeptr->bitrate=320;
  118.                                     else if (checkbits == 11) thisframeptr->bitrate=352;
  119.                                     else if (checkbits == 12) thisframeptr->bitrate=384;
  120.                                     else if (checkbits == 13) thisframeptr->bitrate=416;
  121.                                     else if (checkbits == 14) thisframeptr->bitrate=448;
  122.                                 }
  123.                                 else if (thisframeptr->layer == 2)
  124.                                 {
  125.                                     if (checkbits == 1) thisframeptr->bitrate=32;
  126.                                     else if (checkbits == 2) thisframeptr->bitrate=48;
  127.                                     else if (checkbits == 3) thisframeptr->bitrate=56;
  128.                                     else if (checkbits == 4) thisframeptr->bitrate=64;
  129.                                     else if (checkbits == 5) thisframeptr->bitrate=80;
  130.                                     else if (checkbits == 6) thisframeptr->bitrate=96;
  131.                                     else if (checkbits == 7) thisframeptr->bitrate=112;
  132.                                     else if (checkbits == 8) thisframeptr->bitrate=128;
  133.                                     else if (checkbits == 9) thisframeptr->bitrate=160;
  134.                                     else if (checkbits == 10) thisframeptr->bitrate=192;
  135.                                     else if (checkbits == 11) thisframeptr->bitrate=224;
  136.                                     else if (checkbits == 12) thisframeptr->bitrate=256;
  137.                                     else if (checkbits == 13) thisframeptr->bitrate=320;
  138.                                     else if (checkbits == 14) thisframeptr->bitrate=384;
  139.                                 }
  140.                                 else if (thisframeptr->layer == 3)
  141.                                 {
  142.                                     if (checkbits == 1) thisframeptr->bitrate=32;
  143.                                     else if (checkbits == 2) thisframeptr->bitrate=40;
  144.                                     else if (checkbits == 3) thisframeptr->bitrate=48;
  145.                                     else if (checkbits == 4) thisframeptr->bitrate=56;
  146.                                     else if (checkbits == 5) thisframeptr->bitrate=64;
  147.                                     else if (checkbits == 6) thisframeptr->bitrate=80;
  148.                                     else if (checkbits == 7) thisframeptr->bitrate=96;
  149.                                     else if (checkbits == 8) thisframeptr->bitrate=112;
  150.                                     else if (checkbits == 9) thisframeptr->bitrate=128;
  151.                                     else if (checkbits == 10) thisframeptr->bitrate=160;
  152.                                     else if (checkbits == 11) thisframeptr->bitrate=192;
  153.                                     else if (checkbits == 12) thisframeptr->bitrate=224;
  154.                                     else if (checkbits == 13) thisframeptr->bitrate=256;
  155.                                     else if (checkbits == 14) thisframeptr->bitrate=320;
  156.                                 }
  157.                             }
  158.                             else /* id == 2 or 2.5 */
  159.                             {
  160.                                 if (thisframeptr->layer == 1)
  161.                                 {
  162.                                     if (checkbits == 1) thisframeptr->bitrate=32;
  163.                                     else if (checkbits == 2) thisframeptr->bitrate=48;
  164.                                     else if (checkbits == 3) thisframeptr->bitrate=56;
  165.                                     else if (checkbits == 4) thisframeptr->bitrate=64;
  166.                                     else if (checkbits == 5) thisframeptr->bitrate=80;
  167.                                     else if (checkbits == 6) thisframeptr->bitrate=96;
  168.                                     else if (checkbits == 7) thisframeptr->bitrate=112;
  169.                                     else if (checkbits == 8) thisframeptr->bitrate=128;
  170.                                     else if (checkbits == 9) thisframeptr->bitrate=144;
  171.                                     else if (checkbits == 10) thisframeptr->bitrate=160;
  172.                                     else if (checkbits == 11) thisframeptr->bitrate=176;
  173.                                     else if (checkbits == 12) thisframeptr->bitrate=192;
  174.                                     else if (checkbits == 13) thisframeptr->bitrate=224;
  175.                                     else if (checkbits == 14) thisframeptr->bitrate=256;
  176.                                 }
  177.                                 else if ((thisframeptr->layer == 2) || (thisframeptr->layer == 3)) /* layer 2 or 3 */
  178.                                 {
  179.                                     if (checkbits == 1) thisframeptr->bitrate=8;
  180.                                     else if (checkbits == 2) thisframeptr->bitrate=16;
  181.                                     else if (checkbits == 3) thisframeptr->bitrate=24;
  182.                                     else if (checkbits == 4) thisframeptr->bitrate=32;
  183.                                     else if (checkbits == 5) thisframeptr->bitrate=40;
  184.                                     else if (checkbits == 6) thisframeptr->bitrate=48;
  185.                                     else if (checkbits == 7) thisframeptr->bitrate=56;
  186.                                     else if (checkbits == 8) thisframeptr->bitrate=64;
  187.                                     else if (checkbits == 9) thisframeptr->bitrate=80;
  188.                                     else if (checkbits == 10) thisframeptr->bitrate=96;
  189.                                     else if (checkbits == 11) thisframeptr->bitrate=112;
  190.                                     else if (checkbits == 12) thisframeptr->bitrate=128;
  191.                                     else if (checkbits == 13) thisframeptr->bitrate=144;
  192.                                     else if (checkbits == 14) thisframeptr->bitrate=160;
  193.                                 }
  194.                             }
  195.                         }
  196.                         checkbits=(header[2]-((header[2]/16)*16))/4; /* get the sampling frequency bits */
  197.                         if (checkbits == 3)
  198.                         {
  199.                             thisframeptr->invalidheader=1;
  200.                         }
  201.                         else
  202.                         {
  203.                             if (thisframeptr->id == 1)
  204.                             {
  205.                                 if (checkbits == 0)
  206.                                 {
  207.                                     thisframeptr->frequency=44100;
  208.                                 }
  209.                                 else if (checkbits == 1)
  210.                                 {
  211.                                     thisframeptr->frequency=48000;
  212.                                 }
  213.                                 else
  214.                                 {
  215.                                     thisframeptr->frequency=32000;
  216.                                 }
  217.                             }
  218.                             else if (thisframeptr->id == 2)
  219.                             {
  220.                                 if (checkbits == 0)
  221.                                 {
  222.                                     thisframeptr->frequency=22050;
  223.                                 }
  224.                                 else if (checkbits == 1)
  225.                                 {
  226.                                     thisframeptr->frequency=24000;
  227.                                 }
  228.                                 else
  229.                                 {
  230.                                     thisframeptr->frequency=16000;
  231.                                 }
  232.                             }
  233.                             else if (thisframeptr->id == 4)
  234.                             {
  235.                                 if (checkbits == 0)
  236.                                 {
  237.                                     thisframeptr->frequency=11025;
  238.                                 }
  239.                                 else if (checkbits == 1)
  240.                                 {
  241.                                     thisframeptr->frequency=12000;
  242.                                 }
  243.                                 else
  244.                                 {
  245.                                     thisframeptr->frequency=8000;
  246.                                 }
  247.                             }
  248.                         }
  249.                         checkbits=(header[2]-(header[2]/4)*4)/2; /* get padding bit */
  250.                         if (checkbits)
  251.                         {
  252.                             thisframeptr->padding=1;
  253.                         }
  254.                         checkbits=header[2]-((header[2]/2)*2); /* get private bit */
  255.                         if (checkbits)
  256.                         {
  257.                             thisframeptr->priv=1;
  258.                         }
  259.  
  260.                         /* add here some code to check the last 8 bit */
  261.  
  262.                         if ((thisframeptr->frequency) && (thisframeptr->bitrate))
  263.                         {
  264.                             if (thisframeptr->layer == 1)  /* calculate framelength from header */
  265.                             {
  266.                                 thisframeptr->framelength = (((12*thisframeptr->bitrate*1000)/thisframeptr->frequency)+thisframeptr->padding)*4;
  267.                             }
  268.                             else
  269.                             {
  270.                                 thisframeptr->framelength = ((144*thisframeptr->bitrate*1000)/thisframeptr->frequency)+thisframeptr->padding;
  271.                             }
  272.                         }
  273.                         else
  274.                         {
  275.                             thisframeptr->framelength=0;
  276.                         }
  277. /* ----------------- checking complete -------------------------- */
  278.                         if (!(thisframeptr->invalidheader))  // header is valid
  279.                         {
  280.                             // if (DEBUG) cout <<" + "; // validheader
  281.                             if (lastframeptr)
  282.                             {  // this is not the first frame
  283.                                 if ((thisframeptr->position) == ((lastframeptr->position)+(lastframeptr->framelength)))
  284.                                 {  // framelength is OK
  285.                                     if (nextvalidframeptr)
  286.                                     { // there's still a bad frame before
  287.                                         if (nextvalidframeptr->position == lastframeptr->position)
  288.                                         {
  289.                                             cout <<"Frame "<<setw(5)<<lastvalidframeptr->headercounter<<" @ byte "<<setw(8)<<lastvalidframeptr->position<<" is "<<((nextvalidframeptr->position)-(lastvalidframeptr->position))-(lastvalidframeptr->framelength)<<" bytes too large."<<endl;
  290.                                         }
  291.                                         else
  292.                                         {
  293.                                             cout <<"Frame "<<setw(5)<<lastvalidframeptr->headercounter<<" @ byte "<<setw(8)<<lastvalidframeptr->position<<" is "<<(lastvalidframeptr->position)+(lastvalidframeptr->framelength)-(lastframeptr->position)<<" bytes too short."<<endl;
  294.                                         }
  295.                                         framingerrors++;
  296.                                         delete nextvalidframeptr;
  297.                                         nextvalidframeptr=0;
  298.                                         delete lastvalidframeptr;
  299.                                         lastvalidframeptr=0;
  300.                                     }
  301.                                     if (infolevel)
  302.                                     {
  303.                                         if (infolevel > 1)
  304.                                         {
  305.                                             if (lastframeptr->id == 4)
  306.                                             {
  307.                                                 cout <<"Frame "<<setw(5)<<lastframeptr->headercounter<<" @ byte "<<setw(8)<<lastframeptr->position<<", Mpeg 2.5, layer "<<lastframeptr->layer<<", "<<setw(3)<<lastframeptr->bitrate<<" Kbps, "<<setw(6)<<lastframeptr->frequency<<" Hz,  OK "<<endl;
  308.                                             }
  309.                                             else
  310.                                             {
  311.                                                 cout <<"Frame "<<setw(5)<<lastframeptr->headercounter<<" @ byte "<<setw(8)<<lastframeptr->position<<", Mpeg "<<setw(3)<<lastframeptr->id<<", layer "<<lastframeptr->layer<<", "<<setw(3)<<lastframeptr->bitrate<<" Kbps, "<<setw(6)<<lastframeptr->frequency<<" Hz,  OK "<<endl;
  312.                                             }
  313.                                         }
  314.                                         else
  315.                                         {
  316.                                             cout <<"Frame "<<setw(5)<<lastframeptr->headercounter<<" @ byte "<<setw(8)<<lastframeptr->position<<"  OK "<<endl;
  317.                                         }
  318.                                     }
  319.                                     if (errorframeptr) delete errorframeptr; // clean up
  320.                                     errorframeptr=0;
  321.                                     if (firstvalidframe == -1)
  322.                                     {
  323.                                         firstvalidframe=lastframeptr->position;
  324.                                         headercounter++;
  325.                                         (thisframeptr->headercounter)++;
  326.                                     }
  327.                                     delete lastframeptr;
  328.                                     lastframeptr=thisframeptr;
  329.                                     thisframeptr=0;
  330.                                     headercounter++;
  331.                                 }
  332.                                 else if ((thisframeptr->position) < ((lastframeptr->position)+(lastframeptr->framelength)))
  333.                                 { // Header inside frame
  334.                                     if (!(errorframeptr))
  335.                                     {
  336.                                         errorframeptr=thisframeptr;
  337.                                         thisframeptr=0;
  338.                                     }
  339.                                     else
  340.                                     {
  341.                                         delete thisframeptr;
  342.                                         thisframeptr=0;
  343.                                     }
  344.                                 }
  345.                                 else // Header outside frame
  346.                                 {
  347.                                     if (errorframeptr) // maybe this is the next valid frame
  348.                                     {
  349.                                         if (!(lastvalidframeptr))
  350.                                         {
  351.                                             lastvalidframeptr=lastframeptr;
  352.                                             nextvalidframeptr=thisframeptr;
  353.                                         }
  354.                                         else
  355.                                         {
  356.                                             delete lastframeptr;
  357.                                             lastframeptr=0;
  358.                                             delete thisframeptr;
  359.                                             thisframeptr=0;
  360.                                         }
  361.                                         lastframeptr=errorframeptr;
  362.                                         errorframeptr=0;
  363.                                         thisframeptr=0;
  364.                                         ein.seekg(lastframeptr->position+1);
  365.                                         actualposition=lastframeptr->position+1;
  366.                                         header[0]=ein.get();
  367.                                         header[1]=ein.get();
  368.                                         header[2]=ein.get();
  369.                                     }
  370.                                     else // this is the next valid header
  371.                                     {
  372.                                         cout <<"Frame "<<setw(5)<<lastframeptr->headercounter<<" @ byte "<<setw(8)<<lastframeptr->position<<" is "<<thisframeptr->position-lastframeptr->position-lastframeptr->framelength<<" bytes too long."<<endl;
  373.                                         framingerrors++;
  374.                                         delete lastframeptr;
  375.                                         lastframeptr=thisframeptr;
  376.                                         thisframeptr=0;
  377.                                     }
  378.                                 }
  379.                             }
  380.                             else  // this is the first valid header
  381.                             {
  382.                                 // cout <<"First valid header @ byte "<<thisframeptr->position<<endl;
  383.                                 lastframeptr=thisframeptr;
  384.                                 thisframeptr=0;
  385.                             }
  386.                         }
  387.                         else // invalid header, forget it
  388.                         {
  389.                             if (lastframeptr->position+lastframeptr->framelength == thisframeptr->position)
  390.                             {
  391.                                 cout <<"Invalid header at right position (@ byte "<<thisframeptr->position<<")"<<endl;
  392.                             }
  393.                             else
  394.                             {
  395.                                 // cout <<"Skipping invalid header @ byte "<<thisframeptr->position<<endl;
  396.                             }
  397.                             delete thisframeptr;
  398.                             thisframeptr=0;
  399.                         }
  400.                     }
  401.                     else // new frame
  402.                     {
  403.                         cout <<"Error, could not allocate memory"<<endl;
  404.                         errors++;
  405.                     }
  406.                 }
  407.                 else if ((header[0] == 'T') && (header[1] == 'A') && (header[2] == 'G')) /* tag found */
  408.                 {
  409.                     if (actualposition+128 == filesize)
  410.                     {
  411.                         cout <<"Valid TAG found"<<endl;
  412.                     }
  413.                     else
  414.                     {
  415.                         cout <<"Invalid TAG @ byte "<<actualposition<<endl;
  416.                         invalidtagcounter++;
  417.                     }
  418.                 }
  419.                 header[0]=header[1];
  420.                 header[1]=header[2];    /* prepare for next loop */
  421.                 header[2]=ein.get();
  422.                 actualposition++;
  423.                 if (DEBUG && (filesize != ein.tellg()) && (actualposition+3 != ein.tellg())) cout <<"actualposition: "<<actualposition<<", real position: "<<ein.tellg()<<endl;
  424.             }  // loop till eof
  425.         }
  426.         else // filesize < 1
  427.         {
  428.             cout <<"Error, inputfile \""<<argv[1]<<"\" is too small."<<endl;
  429.             errors++;
  430.         }
  431.     }
  432.     else // ein.is_open
  433.     {
  434.         cout <<"Error while opening inputfile: "<<argv[1]<<endl;
  435.         errors++;
  436.     }
  437.     if (firstvalidframe != -1)
  438.     {
  439.         cout <<headercounter-1<<" valid frames found."<<endl;
  440.         cout <<"First valid frame starts at byte "<<firstvalidframe<<endl;
  441.         if (framingerrors) cout<<"Errors in frames: "<<framingerrors<<endl;
  442.         if (invalidtagcounter) cout <<"Invalid TAGs: "<<invalidtagcounter<<endl;
  443.     }
  444.     else
  445.     {
  446.         cout <<"File \""<<argv[1]<<"\" is not a valid Mpeg audio file."<<endl;
  447.         errors++;
  448.     }
  449.     if (errors) cout <<errors<<" applicationerrors occoured."<<endl;
  450.     return errors;
  451. }
  452.  
  453.  
  454.  
  455.  
  456.  
  457.